let _vue = null
export  default class VueRouter {
    // 创建VueRouter的静态方法 install
    static install(Vue){
        // 1 判断当前插件是否已经被安装
        if(VueRouter.install.installed){
            return
        }
        VueRouter.install.installed = true
        // 2 把Vue构造函数记录到全局变量
        _vue = Vue
        // 3 把创建的Vue实例时候传入的router对象注入到Vue实例上
        _vue.mixin({
            beforeCreate() {
                // 判断是否是vue实例,而不是组件
                if(this.$options.router){
                    // 将router对象注入到vue实例上
                    _vue.prototype.$router = this.$options.router
                    this.$options.router.init()
                }
            }
        })
    }
    constructor(options){
        this.options = options
        this.routerMap = {}
        this.data = _vue.observable({
            current:'/'
        })
    }
    init(){
        this.initRouterMap()
        this.initEvents()
        this.initComponents(_vue)
    }
    initRouterMap(){
        // routes=>[name:'',path:'',component:'']
        // 遍历所有的路由信息，记录路径和组件的映射
        this.options.routes.forEach(route=>{
            // 记录路径和组件的映射关系
            this.routerMap[route.path]=route.component
        })
    }
    initComponents(Vue){
        console.log(1)
        Vue.component('router-link',{
            props:{
                to:String
            },
            render(h) {
                return h('a',{
                    attrs:{
                        href:'#'+ this.to
                    }
                },[this.$slots.default])
            },
        })
        const self = this
        Vue.component('router-view',{
            render(h) {
                let component = self.routerMap[self.data.current]
                return h(component)
            },
        })
    }
    initEvents(){
        // 当路径发生变化后，获取当前路径并记录到current
        window.addEventListener('hashchange',this.onHashChange.bind(this))
        window.addEventListener('load',this.onHashChange.bind(this))
    }
    onHashChange(){
        this.data.current = window.location.hash.substr(1)
    }
}